﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AppCommerciaux
{
    static class Authentification
    {
        private static Boolean autorise = false;
        private static String nom = "";
        private static String prenom = "";
        private static DateTime dateDerniereConnexion = new DateTime();
        private static DirectoryInfo di = new DirectoryInfo(@"c:\Livrable3");

        public static Boolean estAutorise()
        {
            return Authentification.autorise;
        }


        /**
         * CREATION DE COMPTE UTILISATEUR
         */
        public static Boolean Create(string wEmail, string wMdp, string wNom, string wPrenom, string wFichier = "")
        {
            try
            {
                if (wFichier == "lambda")
                // Création de compte pour un utilisateur lambda
                {
                    // Accès au fichier de login lambda en écriture
                    FileInfo fi = new FileInfo(di.FullName + @"\login.lic");

                    using (StreamWriter sw = fi.CreateText())
                    {
                        // On l'écrit sur la première ligne du fichier
                        sw.WriteLine(wEmail);

                        // On hashe le mot de passe de l'utilisateur
                        string wHashMdp = Hash.GetSHA1Hash(wMdp);
                        // On écrit le mdp hashé sur la deuxième ligne
                        sw.WriteLine(wHashMdp);

                        sw.WriteLine(wNom);
                        sw.WriteLine(wPrenom);
                        dateDerniereConnexion = DateTime.Now;
                        sw.WriteLine(dateDerniereConnexion.ToString());
                        sw.Close();
                    }

                    // On crypte le fichier
                    CrypterFichier("login");
                }
                else
                // Sinon, Création de compte pour un utilisateur admin
                {
                    // On fait rien...
                }
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
                // et puis on verra...
            }
        }

        /*
         * CONTROLE D'ACCES A L'APPLICATION
         */
        public static Boolean Login(string wEmail, string wMdp, string wFichier = "")
        {
            //nbEssai++;
            try
            {
                if (wFichier == "lambda")
                {
                    // Contrôle du login utilisateur lambda
                    Authentification.autorise = ControleLogin(".", @"\login.lic", wEmail, wMdp); 
                }
                else
                {
                    // Contrôle du login utilisateur admin
                    // autorise = ControleLogin(".", @"\" + Hash.GetSHA1Hash("login.lic"), wEmail, wMdp);
                }

                return Authentification.autorise;
            }
            catch (Exception)
            {
                throw;
            }
        }

        /*
         * DECONNEXION
         */
        public static void Deconnexion()
        {
            // On teste que l'utilisateur était bien connecté (en effet on passe dans cette fonction aussi
            //      quand on quitte l'appli avec le bouton de fermeture de fenêtre windows, donc sans
            //      être nécessairement connecté
            if (Authentification.estAutorise())
            {
                // On décrypte le fichier et on récupère le résultat dans un tableau
                String[] lines = DecrypterFichier("login");

                // Accès au fichier de login lambda en écriture
                FileInfo fi = new FileInfo(di.FullName + @"\login.lic");

                using (StreamWriter sw = fi.CreateText())
                {
                    // On l'écrit sur la première ligne du fichier
                    sw.WriteLine(lines[0]);
                    sw.WriteLine(lines[1]);
                    sw.WriteLine(lines[2]);
                    sw.WriteLine(lines[3]);
                    dateDerniereConnexion = DateTime.Now;
                    sw.WriteLine(dateDerniereConnexion.ToString());
                    sw.Close();
                }

                // On crypte le fichier
                CrypterFichier("login");

                // On efface les données de connexion de la classe
                Authentification.autorise = false;
                Authentification.nom = "";
                Authentification.prenom = "";
            }
        }

        /**
         * Retourne les infos de connnexion
         * 
         */
        public static String[] getInfoConnexion()
        {
            return new String[] { Authentification.nom, Authentification.prenom, Authentification.dateDerniereConnexion.ToString() };
        }

        /**
         * LECTURE D'UN FICHIER DE LOGIN ET COMPARAISON DES IDENTIFIANTS
         */
        private static Boolean ControleLogin(string wDir, string wNomFichier, string wEmail, string wMdp)
        {
            Boolean wRetour = true;

            // On décrypte le fichier et on récupère le résultat dans un tableau
            String[] lines = DecrypterFichier("login");

            // On compare l'email saisie avec celle du fichier
            if (wEmail != lines[0])
            {
                wRetour = false;
            }

            // On hashe le mot de passe saisi
            string wHashMdp = Hash.GetSHA1Hash(wMdp);

            // On compare le mot de passe saisi avec celui du fichier
            if (wHashMdp != lines[1])
            {
                wRetour = false;
            }

            if (wRetour)
            {
                Authentification.nom = lines[2];
                Authentification.prenom = lines[3];
                Authentification.dateDerniereConnexion = DateTime.Parse(lines[4]);
            }

            // On retourne le résultat du contrôle
            return wRetour;
        }

        /**
         * MODIFICATION DU MOT DE PASSE
         */
        public static Int16 ChangerMotPasse(string wMdpActuel, string wMdpFutur1, string wMdpFutur2)
        {
            Int16 wRetour = 0;

            // On décrypte le fichier et on récupère le résultat dans un tableau
            String[] lines = DecrypterFichier("login");

            // On hashe le mot de passe saisi
            wMdpActuel = Hash.GetSHA1Hash(wMdpActuel);

            // On compare le mot de passe saisi avec celui du fichier
            if (wMdpActuel != lines[1])
            {
                wRetour = 1;
            }

            if (wRetour == 0)
            {
                if (wMdpFutur1 != wMdpFutur2)
                {
                    wRetour = 2;
                }
            }

            if (wRetour == 0)
            {
                // On hashe le nouveau mot de passe saisi
                lines[1] = Hash.GetSHA1Hash(wMdpFutur1);

                // Accès au fichier de login lambda en écriture
                FileInfo fi = new FileInfo(di.FullName + @"\login.lic");

                using (StreamWriter sw = fi.CreateText())
                {
                    // On l'écrit sur la première ligne du fichier
                    sw.WriteLine(lines[0]);
                    sw.WriteLine(lines[1]);
                    sw.WriteLine(lines[2]);
                    sw.WriteLine(lines[3]);
                    sw.WriteLine(lines[4]);
                    sw.Close();
                }

                // On crypte le fichier
                CrypterFichier("login");
            }

            // On retourne le résultat du contrôle
            return wRetour;
        }

        /**
         * Crypter un fichier
         */
        private static void CrypterFichier(String nomFichier)
        {
            Byte[] bytes = File.ReadAllBytes(di.FullName + @"\" + nomFichier + ".lic");
            CryptoData cdEn = new CryptoData();
            Byte[] encryptBytes = cdEn.encryptData(bytes);
            File.WriteAllBytes(di.FullName + @"\" + nomFichier + ".lic", encryptBytes);
        }

        /**
         * Décrypter un fichier
         */
        private static String[] DecrypterFichier(String nomFichier)
        {
            // On décrypte le fichier de login et on le copie sous un autre nom
            Byte[] bytes = File.ReadAllBytes(di.FullName + @"\" + nomFichier + ".lic");
            CryptoData cd = new CryptoData();
            Byte[] decryptBytes = cd.myDecryptData(bytes);
            File.WriteAllBytes(di.FullName + @"\" + nomFichier + ".tmp", decryptBytes);

            // On lit le fichier décrypter qu'on vient d'écrire
            String[] lines = System.IO.File.ReadAllLines(di.FullName + @"\" + nomFichier + ".tmp");

            // On supprime le fichier temporaire de login
            System.IO.File.Delete(di.FullName + @"\" + nomFichier + ".tmp");

            return lines;
        }

    }
}
